# Интерфейсы

## main/java/exercise/Home.java

## Задачи

* Реализуйте интерфейс `Home` для работы с недвижимостью. Этот интерфейс содержит два метода:

  * `getArea()` — предназначен для получения общей площади объекта недвижимости.
  * `compareTo()` — Служит для сравнения двух объектов недвижимости по их площади.

## main/java/exercise/Flat.java

* Реализуйте класс `Flat()`, который представляет объект недвижимости — квартиру. Класс должен реализовывать интерфейс `Home`. Конструктор класса принимает на вход три параметра:

  * `area` — жилая площадь квартиры, число типа `double`
  * `balconyArea` — площадь балкона, число типа `double`
  * `floor` — этаж, на котором расположена квартира

   Общая площадь квартиры складывается из жилой площади и площади балкона.

   Метод `toString()` должен возвращать представление квартиры в виде строки формата "Квартира площадью 56 метров на 5 этаже".

   Метод `compareTo(Home another)` в качестве аргумента принимает другой объект недвижимости и сравнивает их по площади. Метод должен вернуть 1, если площадь текущего объекта больше площади переданного; -1, если площадь текущего объекта меньше площади переданного и 0, если площади равны.

  ```java
  Home flat = new Flat(54.5, 4, 3);
  double area = flat.getArea(); // 58.5
  flat.toString(); // "Квартира площадью 58.5 метров на 3 этаже"
  ```

## main/java/exercise/Cottage.java

* Реализуйте класс `Cottage()`, который представляет еще один объект недвижимости — коттедж. Класс должен реализовывать интерфейс `Home`. Конструктор класса принимает на вход два параметра:

  * `area` — Общая площадь коттеджа, число типа `double`
  * `floorCount` — количество этажей

   Метод `toString()` должен возвращать представление коттеджа в виде строки формата "2 этажный коттедж площадью 120.5 метров".

   Метод `compareTo(Home another)` работает аналогично методу в классе `Flat`

  ```java
  Home cottage = new Cottage(135, 2);
  double area = cottage.getArea(); // 135
  cottage.toString(); // "2 этажный коттедж площадью 135 метров"
  ```

## main/java/exercise/App.java

* Создайте класс `App` с публичным статическим методом `buildApartmentsList()`. Метод принимает в качестве первого аргумента список `List` объектов недвижимости, реализующих интерфейс `Home`. Метод сортирует объекты по площади по возрастанию, берет первые n элементов и возвращает  строковые представления этих объектов в виде списка `List`. Количество `n` элементов передаётся в метод `buildApartmentsList()` вторым параметром.

```java
List<Home> apartments = new ArrayList<>(List.of(
    new Flat(41, 3, 10),
    new Cottage(125.5, 2),
    new Flat(80, 10, 2),
    new Cottage(150, 3)
));

List<String> result = App.buildApartmentsList(apartments, 3);
System.out.println(result); // =>
// [
//     Квартира площадью 44.0 метров на 10 этаже,
//     Квартира площадью 90.0 метров на 2 этаже,
//     2 этажный коттедж площадью 125.5 метров
// ]
```

## Самостоятельная работа

* В файле *ReversedSequence.java* реализуйте класс `ReversedSequence`, который реализует стандартный интерфейс java.lang `CharSequence`. Конструктор класса принимает на вход строку. Ваша реализация должна представлять последовательность в перевернутом виде.

```java
CharSequence text = new ReversedSequence("abcdef");
text.toString(); // "fedcba"
text.charAt(1); // 'e'
text.length(); // 6
text.subSequence(1, 4).toString(); // "edc"
```

* Напишите тесты для проверки методов класса `ReversedSequence`.
